package com.ingenio.dao;

import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.ingenio.Adapter;
import com.ingenio.business.Almacen;
import com.ingenio.business.DetalleRecuento;
import com.ingenio.business.EstadoDetalleRecuento;
import com.ingenio.business.Producto;
import com.ingenio.business.Recuento;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;

public class DetalleRecuentoAdapter extends Adapter{
   
	public List<DetalleRecuento> devolverDetalle(Integer idRecuento) throws Exception{
		Connection conn = null;
    	List<DetalleRecuento> detalles = new ArrayList<DetalleRecuento>();
    	PreparedStatement stmt = null;
    	DetalleRecuento dr = null;
    	Producto pr = null;
		ProductoAdapter pa = new ProductoAdapter();
		Almacen al = null;
		AlmacenAdapter aa = new AlmacenAdapter();
		RecuentoAdapter ra = new RecuentoAdapter();
		Recuento r = null;
		EstadoDetalleRecuentoAdapter edra = new EstadoDetalleRecuentoAdapter();
		EstadoDetalleRecuento edr = null;
    	try {
			conn = (Connection) abrirConexion();
    		String sel ="SELECT * from detallerecuento WHERE IdRecuento = ?";
    		stmt = (PreparedStatement) conn.prepareStatement(sel);
    		stmt.setInt(1, idRecuento);
    		ResultSet result = stmt.executeQuery();
    		while(result.next()){
    			String idProducto = result.getString("IdProducto");
    			Date fechaRecuento = result.getTimestamp("fechaRecuento");
    			Double cantidadRec = result.getDouble("cantidadEntregada");
    			Integer idAlmacen = result.getInt("IdAlmacen");
    			Integer idEstadoDetalle = result.getInt("IdEstadoDetalleRecuento");
    			pr = pa.devolverProducto(idProducto);
    			r = ra.devolverRecuento(idRecuento);
    			al = aa.devolverAlmacen(idAlmacen);
    			edr = edra.devolverEstadoDetalleRecuento(idEstadoDetalle);
    			dr = new DetalleRecuento(pr, al, r, cantidadRec, fechaRecuento, edr);
    			detalles.add(dr);
    		}
		}
		catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error al conectar con la base de datos.", e);
		}
    	finally{
    		cerrarConexion(conn);
    	}
    	return detalles;
	}
	
	public boolean guardarDetalleRecuento(List<DetalleRecuento> detalle, Integer idRecuento, Connection conn) throws Exception{
    	try{
	    	String add_detalle = "INSERT into detallerecuento (IdRecuento, IdProducto, fechaRecuento, cantidadRecuento, IdAlmacen, IdEstadoDetalleRecuento) " +
					"VALUES (?, ?, ?, ?, ?, ?)";
			PreparedStatement stmtInsert = (PreparedStatement) conn.prepareStatement(add_detalle);
			//Date now = new Date();
			for (DetalleRecuento detalleRecuento : detalle) {
				stmtInsert.setInt(1, idRecuento);
				stmtInsert.setString(2, detalleRecuento.getProducto().getIdProducto());
				stmtInsert.setTimestamp(3, new Timestamp(detalleRecuento.getFechaRecuento().getTime()));
				stmtInsert.setDouble(4, detalleRecuento.getCantidadRec());
				stmtInsert.setInt(5, detalleRecuento.getAlmacen().getIdAlmacen());
				stmtInsert.setInt(6, 1); // seteo en Pendiente de recuento
				stmtInsert.addBatch();
			}
			stmtInsert.executeBatch();	
		}
    	catch (Exception e) {
			e.printStackTrace();
			return false;
		}
    	return true;
	}

	public boolean registrarDetalleRecuento(List<DetalleRecuento> detalle, Connection conn) throws Exception{
		try{
			String query = "UPDATE detallerecuento SET cantidadRecuento = ?, IdEstadoDetalleRecuento = ?, fechaRecuento = ? WHERE IdRecuento = ? and IdProducto = ?";
			PreparedStatement stmt = (PreparedStatement) conn.prepareStatement(query);
			for(DetalleRecuento dr: detalle){
				stmt.setDouble(1, dr.getCantidadRec());
				stmt.setInt(2, 2); // seteo el estado en 2.- Contado (Pendiente de aprobacion)
				stmt.setTimestamp(3, new Timestamp(dr.getFechaRecuento().getTime()));
				stmt.setInt(4, dr.getRecuento().getIdRecuento());
				stmt.setString(5, dr.getProducto().getIdProducto());
				stmt.addBatch();
			}
			stmt.executeBatch();
		}catch(Exception e){
			e.printStackTrace();
			return false;
		}
    	return true;
	}
}
